// 无法在类或方法装饰器中获取ExectuionContext对象或Request对象，因为这些装饰器在导入时立即运行。
import { ExecutionContext, Inject } from '@nestjs/common';
import { RedisCommonService } from '../redis/redis.service';

// 导出一个函数，用于缓存响应
export function CacheResponse(ttl: number = 60) {
  // 注入redis管理器(@Global())
  const injectRedisManager = Inject(RedisCommonService);

  // 返回一个函数，用于装饰器
  return function (
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor,
  ) {
    // 获取原始方法
    const originalMethod = descriptor.value;

    // const geturl = (data: any, ctx: ExecutionContext) => {
    //   const request = ctx.switchToHttp().getRequest();
    //   return request.originalUrl || request.url; // 获取完整的URL
    // };
    // geturl();

    // 将缓存管理器注入到目标对象中
    injectRedisManager(target, 'injectRedisManager');

    // 重写原始方法
    descriptor.value = async function (...args: any[]) {
      // 生成缓存键
      const cacheKey = `${propertyKey}_${JSON.stringify(args)}`;
      console.log('🚀 ~ cache.decorator.ts:33 ~ cacheKey:', cacheKey, args);

      // 尝试从缓存获取
      const cachedData = await this.injectRedisManager.apiGet(cacheKey);
      if (cachedData) {
        console.log('🚀 ~ cache.decorator.ts:30 ~ : 使用缓存', cacheKey);
        // 如果缓存中有数据，则直接返回
        return JSON.parse(cachedData);
      }

      // 执行原始方法
      const result = await originalMethod.apply(this, args);

      console.log('🚀 ~ cache.decorator.ts:38 ~ result: 进行缓存', args);

      // 存入缓存
      await this.injectRedisManager.apiSet(
        cacheKey,
        JSON.stringify(result),
        ttl,
      );

      return result;
    };

    return descriptor;
  };
}
